
package com.itbaizhan.mapper;

import com.itbaizhan.pojo.User;
import com.itbaizhan.provider.UserProvider;
import org.apache.ibatis.annotations.*;

import java.util.List;
/*开启二级缓存*/
@CacheNamespace(blocking = true)
/*MyBatis注解开发*/
public interface UserMapper {
    @Select("select * from user")
    List<User> findAll();
    /*主键回填*/
    @SelectKey(keyProperty = "id", keyColumn = "id",resultType = int.class,before = false,statement = "SELECT LAST_INSERT_ID()")
    /*增加用户*/
    @Insert("insert into user(username,sex,address) values(#{username},#{sex},#{address})")
    void insertUser(User user);

    /*更新数据*/
    @Update("update user set username = #{username},sex = #{sex}, address = #{address} where id = #{id} ")
    void update(User user);

    @Delete("delete  from user where id = #{id}")
    void delete(int id);

    @Select("select * from user where username like #{username}")
    List<User> findByUsername(String username);

    /*动态sql语句
    方法一;
    * 使用脚本标签
   将Sql嵌套在<script>内即可使用动态Sql标签
   * 一般是在映射文件中写好sql语句 再复制过来  在script 的加号后 加“ ”  在双引号里粘贴 */
 //   @Select("<script>"+"select * from user  where 1=1\n" +
  //          "    <if test=\"username != null and username.length() != 0\">\n" +
//            "    /*这里是模糊查询*/\n" +
  //          "      and username like #{username}\n" +
//            "    </if>\n" +
//            "    <if test=\"sex != null and sex.length() != 0\">\n" +
//            "        and sex = #{sex}\n" +
 //           "    </if>\n" +
 //           "     <if test=\"address != null and address.length() != 0\">\n" +
//            "         and address = #{address}\n" +
//            "     </if>"+
//            "</script>")
//    List<User> findByCondition(User user);

    /*方法二
    * 在MyBatis中有@SelectProvider、@UpdateProvider、@DeleteProvider、@InsertProvider注解。
    * 当使用这些注解时将不在注解中直接编写SQL，而是调用某个类的方法来生成SQL。
    * type: 调用类   method:调用类中的方法*/
    @SelectProvider(type = UserProvider.class  ,method = "findByConditionSql")
    List<User> findByCondition(User user);

    @Select("select * from user where id = #{id}")
    User findById(int id);
}


/*MyBatis可以使用注解替代映射文件。映射文件的作用就是定义Sql语句，可以在持久层接口上使用@Select/@Delete/@Insert/@Update定义Sql语句，这样就不需要使用映射文件了。

创建maven工程，引入依赖

创建mybatis核心配置文件SqlMapConfig.xml

将log4j.properties文件放入resources中，让控制台打印SQL语句。

创建实体类

创建持久层接口，并在接口方法上定义Sql语句

public interface UserMapper {
  @Select("select * from user")
  List<User> findAll();
}
由于注解在方法上方，而方法中就有参数类型和返回值类型，所以使用注解开发不需要定义参数类型和返回值类型

在核心配置文件注册持久层接口，由于没有映射文件，所以只能采用注册接口或注册包的方法。

<mappers>
  <package name="com.itbaizhan.mapper"/>
</mappers>*/